#include <iostream>
#include "stdio.h"
#include "time.h"

using namespace std;

double grayFilter (int tamanhoArquivo, unsigned char *linha3, char *saida3){
	int i, numParcial;
	clock_t comeco, fim;
	double tempoGasto;

	comeco = clock();
	for (i = 0; i < tamanhoArquivo; i++){
		numParcial = linha3[i];
		numParcial += 255;
		numParcial /= 2;
		saida3[i] = numParcial;
	}
	fim = clock();
	tempoGasto = ((double) (fim - comeco)) / CLOCKS_PER_SEC;
	return tempoGasto;
}

int main(int argc, char* argv[]){
	FILE *imagemEntrada, *imagemSaida;
	int largura, altura, profundidade, tamanhoArquivo=1; // COMECA COM 1 PELO \0
	char linha1[3], *saida3;
	unsigned char *linha3; // TEM QUE SER UNSIGNED PARA NAO MANDAR VALORES NEGATIVOS PARA A HORA DE CONVERTER
	double tempoGasto;

	imagemEntrada = fopen(argv[1], "rb");
	imagemSaida = fopen(argv[2], "wb");

	if ((imagemEntrada != NULL) && (imagemSaida != NULL)){

		fread(linha1, 1, 3, imagemEntrada);
		fscanf(imagemEntrada, "%d %d %d\n", &largura, &altura, &profundidade);

		tamanhoArquivo += largura * altura * 3; // 3 CANAIS, CADA UM COM 1 CHAR
		linha3 = (unsigned char*) malloc (tamanhoArquivo*sizeof(unsigned char));
		tamanhoArquivo--; //POIS O SAIDA3 NAO PRECISA DO \0
		saida3 = (char*) malloc (tamanhoArquivo*sizeof(char));

		if ((linha3 != NULL) && (saida3 != NULL)){

			tamanhoArquivo++;
			fread(linha3, 1, tamanhoArquivo, imagemEntrada);
			tamanhoArquivo--;

			tempoGasto = grayFilter (tamanhoArquivo, linha3, saida3);

			fprintf (imagemSaida,"%c%c%c",linha1[0] ,linha1[1],10);
			fprintf (imagemSaida,"%d %d %d%c", largura, altura, profundidade, 10);
			fwrite (saida3, 1, tamanhoArquivo, imagemSaida);
			fprintf (imagemSaida,"%c",10);
			cout << "Tempo gasto (em segundos): " << tempoGasto << endl;

			free (linha3);
			free (saida3);
		}
		else
			cout << "Nao foi possivel alocar memoria" << endl;

		fclose(imagemEntrada);
		fclose(imagemSaida);
	}
	else
		cout << "Houve um problema com alguma das imagens" << endl;
	return 0;
}